﻿using System;
using System.Collections.Generic;
using SQLite;
using Wino.Core.Domain.Entities.Shared;
using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Models.MailItem;

namespace Wino.Core.Domain.Entities.Mail;

/// <summary>
/// Summary of the parsed MIME messages.
/// Wino will do non-network operations on this table and others from the original MIME.
/// </summary>
public class MailCopy : IMailItem
{
    /// <summary>
    /// Unique Id of the mail.
    /// </summary>
    [PrimaryKey]
    public Guid UniqueId { get; set; }

    /// <summary>
    /// Not unique id of the item. Some operations held on this Id, some on the UniqueId.
    /// Same message can be in different folder. In that case UniqueId is used.
    /// </summary>
    public string Id { get; set; }

    /// <summary>
    /// Folder that this mail belongs to.
    /// </summary>
    public Guid FolderId { get; set; }

    /// <summary>
    /// Conversation id for the mail.
    /// </summary>
    public string ThreadId { get; set; }

    /// <summary>
    /// MIME MessageId if exists.
    /// </summary>
    public string MessageId { get; set; }

    /// <summary>
    /// References header from MIME
    /// </summary>
    public string References { get; set; }

    /// <summary>
    /// In-Reply-To header from MIME
    /// </summary>
    public string InReplyTo { get; set; }

    /// <summary>
    /// Name for the sender.
    /// </summary>
    public string FromName { get; set; }

    /// <summary>
    /// Address of the sender.
    /// </summary>
    public string FromAddress { get; set; }

    /// <summary>
    /// Subject of the mail.
    /// </summary>
    public string Subject { get; set; }

    /// <summary>
    /// Short preview of the content.
    /// </summary>
    public string PreviewText { get; set; }

    /// <summary>
    /// Date that represents this mail has been created in provider servers.
    /// Stored always in UTC.
    /// </summary>
    public DateTime CreationDate { get; set; }

    /// <summary>
    /// Importance of the mail.
    /// </summary>
    public MailImportance Importance { get; set; }

    /// <summary>
    /// Read status for the mail.
    /// </summary>
    public bool IsRead { get; set; }

    /// <summary>
    /// Flag status.
    /// Flagged for Outlook.
    /// Important for Gmail.
    /// </summary>
    public bool IsFlagged { get; set; }

    /// <summary>
    /// To support Outlook.
    /// Gmail doesn't use it.
    /// </summary>
    public bool IsFocused { get; set; }

    /// <summary>
    /// Whether mail has attachments included or not.
    /// </summary>
    public bool HasAttachments { get; set; }

    /// <summary>
    /// Assigned draft id.
    /// </summary>
    public string DraftId { get; set; }

    /// <summary>
    /// Whether this mail is only created locally.
    /// </summary>
    [Ignore]
    public bool IsLocalDraft => !string.IsNullOrEmpty(DraftId) && DraftId.StartsWith(Constants.LocalDraftStartPrefix);

    /// <summary>
    /// Whether this copy is draft or not.
    /// </summary>
    public bool IsDraft { get; set; }

    /// <summary>
    /// File id that this mail is assigned to.
    /// This Id is immutable. It's used to find the file in the file system.
    /// Even after mapping local draft to remote draft, it will not change.
    /// </summary>
    public Guid FileId { get; set; }

    /// <summary>
    /// Folder that this mail is assigned to.
    /// Warning: This field is not populated by queries.
    /// Services or View Models are responsible for populating this field.
    /// </summary>
    [Ignore]
    public MailItemFolder AssignedFolder { get; set; }

    /// <summary>
    /// Account that this mail is assigned to.
    /// Warning: This field is not populated by queries.
    /// Services or View Models are responsible for populating this field.
    /// </summary>
    [Ignore]
    public MailAccount AssignedAccount { get; set; }

    /// <summary>
    /// Contact information of the sender if exists.
    /// Warning: This field is not populated by queries.
    /// Services or View Models are responsible for populating this field.
    /// </summary>
    [Ignore]
    public AccountContact SenderContact { get; set; }

    public IEnumerable<Guid> GetContainingIds() => [UniqueId];
    public override string ToString() => $"{Subject} <-> {Id}";
}
